package lazy.util;

import java.util.*;
import lazy2.util.StringUtil;

/**
 * 一個有用的字串工具。
 * 有部份方法由{@link wty.lazy2.util.StringUtil}所取代，
 * 建議直接使用{@link wty.lazy2.util.StringUtil}。
 * @author Tim Wang
 * @see wty.lazy2.util.StringUtil
 */
public class StringUtils {
	/**
	 * 判斷字串是否有值。
	 * @param s
	 * @return
	 * 如果字串不為null且非空字串。
	 */
	public static boolean hasText(String s) {return s!=null && s.length()>0;}
	
	/**
	 * 判斷字串陣列是否有直。
	 * @param s
	 * @return
	 * 如果字串陣列不為null且長度不為0。
	 */
	public static boolean hasText(String[] s) {return s!=null && s.length>0;}
	
	/**
	 * 將methodName轉換為property。
	 * @param method
	 * 符合getter、setter命名的方法名稱。
	 * @return
	 * 若方法名稱不符合getter、setter命名，則回傳原method。
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#toProperty(String)} 取代。
	 */
	public static String toProperty(String method) {return StringUtil.toProperty(method);}
	
	/**
	 * 將property轉換為getProperty。
	 * @param property
	 * @return
	 * 此property的getter名稱。
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#toGetter(String)} 取代。
	 */
	public static String toGetter(String property) {return StringUtil.toGetter(property);}
	
	/**
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#toSetter(String)} 取代。
	 * @param property
	 * @return
	 * 此property的setter名稱。
	 */
	public static String toSetter(String property) {return StringUtil.toSetter(property);}
	
	/**
	 * 將一字串s的第index個字變為小寫。
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#toLowerCase(String, int)} 取代。
	 * @param s
	 * @param index
	 * @return
	 * 已改變為小寫的新字串。
	 */
	public static String toLowerCase(String s, int index) {return StringUtil.toLowerCase(s, index);}
	
	/**
	 * 將一字串s的第index個字變為大寫。
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#toUpperCase(String, int)}
	 * @param s
	 * @param index
	 * @return
	 * 已改變為大寫的新字串。
	 */
	public static String toUpperCase(String s, int index) {return StringUtil.toUpperCase(s, index);}
	
	/**
	 * 依據level來決定要擷取第幾個beginStr和endStr間的字串。
	 * @param text
	 * @param beginStr
	 * @param endStr
	 * @param level
	 * @return
	 * 若是text中找不到beginStr和endStr，則回傳null。
	 */
	public static String retrieve(String text, String beginStr, String endStr, int level) {
		String result = null;
		if(hasText(text) && hasText(beginStr) && hasText(endStr)) {
			if(level<1) level = 1;
			int beginIndex = 0;
			for(int i=0;i<level;i++) {
				if(i==0) beginIndex = text.indexOf(beginStr, 0);
				else beginIndex = text.indexOf(beginStr, beginIndex+beginStr.length());
			}
			if(beginIndex!=-1) {
				beginIndex += beginStr.length();
				int endIndex = text.indexOf(endStr, beginIndex);
				if(endIndex!=-1) result = text.substring(beginIndex, endIndex);
			}
		}
		return result;
	}
	
	/**
	 * 擷取beginStr和endStr間的字串。
	 * @param text
	 * @param beginStr
	 * @param endStr
	 * @return
	 * 若是text中找不到beginStr和endStr，則回傳null。
	 */
	public static String retrieve(String text, String beginStr, String endStr) {
		return retrieve(text, beginStr, endStr, 1);
	}
	
	private static final char[] UID_CHARACTERS = {
		'0','1','2','3','4','5','6','7','8','9',
		'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
		'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
		'_','-'
	};
	
	public static String getUID(int length) {
		String uid = null;
		if(length>0) {
			char[] s = new char[length];
			Random rand = new Random();
			int n = UID_CHARACTERS.length;
			for(int i=0;i<length;i++)
				s[i] = UID_CHARACTERS[rand.nextInt(n)];
			uid = new String(s);
		}
		return uid;
	}
	
	/**
	 * 將一字串中所有正、負整數列出。
	 * @param s
	 * @return
	 * 字串中的正、負整數。
	 */
	public static List<Integer> retrieveDigits(String s) {
		return retrieveDigits(s, false);
	}
	
	/**
	 * 將一字串中的整數列出。
	 * @deprecated
	 * 已被 {@link wty.lazy2.util.StringUtil#retrieveDigits(String, boolean)} 取代。
	 * @param s
	 * @param isIgnoreSign
	 * 是否忽略正、負號
	 * @return
	 * 字串中的整數。
	 */
	public static List<Integer> retrieveDigits(String s, boolean isIgnoreSign) {
		return StringUtil.retrieveDigits(s, isIgnoreSign);
	}
	
	/**
	 * 判斷字串是否為數字。
	 * @param s
	 * @return
	 * 若為數字則回傳true；否則false。
	 */
	public static boolean isNumber(String s) {
		if(!hasText(s)) return false;
		char[] cs = s.toCharArray();
		int dotCounter = 0;
		for(char c:cs) {
			if(c=='.') {
				dotCounter++;
				if(dotCounter>1) return false;
			} else {
				if(c<48 || c>57) return false;
			}
		}
		return true;
	}
}
